home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LT_LayoutMenus.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-08-22
|
5KB
|
229 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
struct Menu *
LT_LayoutMenus(LayoutHandle *handle,struct NewMenu *menuTemplate,...)
{
struct Menu *Result;
va_list VarArgs;
va_start(VarArgs,menuTemplate);
Result = LT_LayoutMenusA(handle,menuTemplate,(struct TagItem *)VarArgs);
va_end(VarArgs);
return(Result);
}
/*****************************************************************************/
/****** gtlayout.library/LT_LayoutMenusA ******************************************
*
* NAME
* LT_LayoutMenusA -- Create a menu according to a template.
*
* SYNOPSIS
* Menu = LT_LayoutMenusA(Handle,Template,Tags);
* D0 A0 A1 A2
*
* struct Menu *LT_LayoutMenusA(LayoutHandle *,struct NewMenu *,
*
* struct TagItem *);
*
* Menu = LT_LayoutMenus(Handle,Template,...);
*
* struct Menu *LT_LayoutMenus(LayoutHandle *,struct NewMenu *,...);
*
* FUNCTION
* Unlike the corresponding routines in gadtools.library
* LT_LayoutMenusA() will both create and layout a menu.
* Also included is locale support.
*
* INPUTS
* Handle - Pointer to LayoutHandle structure.
*
* Template - Address of a ready-to-use NewMenu table to
* create the menu from.
*
* Tags - Tagitem list to control menu attributes
*
* Tags:
*
* LAMN_FirstLabel (LONG) - Locale ID of the first string to
* use as a menu title/item/subitem label. This tag
* works in conjunction with LA_LastLabel.
*
* LAMN_LastLabel (LONG) - Locale ID of the last string to
* use as a menu title/item/subitem label. This tag
* works in conjunction with LA_FirstLabel. The code
* will loop through FirstLabel..LastLabel and assign
* the corresponding locale text for each ID to the
* NewMenu.nm_Label entries. Labels which are already
* initialized with NM_BARLABEL are skipped.
*
* LAMN_LabelTable (LONG *) - Pointer to an array of IDs
* to use for building the menu labels. This requires
* that a locale hook is provided with the layout handle.
* The array is terminated by -1.
*
* RESULT
* Menu - Pointer to a Menu structure. You can free this
* using gadtools.library/FreeMenus().
*
******************************************************************************
*
*/
struct Menu * LIBENT
LT_LayoutMenusA(REG(a0) LayoutHandle *handle,REG(a1) struct NewMenu *menuTemplate,REG(a2) struct TagItem *TagParams)
{
struct Menu *menu;
menu = NULL;
if(handle)
{
struct TagItem *tag,*List = TagParams;
LONG label,last;
LONG *Table = NULL;
ULONG allocSize;
BOOL foundFirst;
BOOL foundLast;
foundFirst = FALSE;
foundLast = FALSE;
while(tag = NextTagItem(&List))
{
switch(tag->ti_Tag)
{
case LA_LabelTable:
Table = (LONG *)tag->ti_Data;
break;
case LA_FirstLabel:
foundFirst = TRUE;
label = tag->ti_Data;
break;
case LA_LastLabel:
foundLast = TRUE;
last = tag->ti_Data;
break;
}
}
if(foundFirst == foundLast || Table)
{
struct NewMenu *localTemplate = NULL;
if(Table)
{
foundFirst = FALSE;
if(handle->LocaleHook)
{
LONG count;
count = 0;
while(menuTemplate[count].nm_Type != NM_END)
count++;
count++;
if(localTemplate = LTP_Alloc(handle,allocSize = sizeof(struct NewMenu) * count))
{
LONG i;
CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
for(i = 0 ; *Table != -1 && i < count ; i++)
{
if(localTemplate[i].nm_Label != NM_BARLABEL && (localTemplate[i].nm_Type == NM_TITLE || localTemplate[i].nm_Type == NM_ITEM || localTemplate[i].nm_Type == NM_SUB))
localTemplate[i].nm_Label = (STRPTR)CallHookPkt(handle->LocaleHook,handle,(APTR)(*Table++));
}
}
}
menuTemplate = localTemplate;
}
if(foundFirst)
{
if(handle->LocaleHook)
{
LONG count;
count = 0;
while(menuTemplate[count].nm_Type != NM_END)
count++;
count++;
if(localTemplate = LTP_Alloc(handle,allocSize = sizeof(struct NewMenu) * count))
{
LONG i;
CopyMem(menuTemplate,localTemplate,sizeof(struct NewMenu) * count);
if(foundLast)
count = last - label + 1;
for(i = 0 ; i < count ; i++)
{
if(localTemplate[i].nm_Label != NM_BARLABEL && (localTemplate[i].nm_Type == NM_TITLE || localTemplate[i].nm_Type == NM_ITEM || localTemplate[i].nm_Type == NM_SUB))
{
localTemplate[i].nm_Label = (STRPTR)CallHookPkt(handle->LocaleHook,handle,(APTR)label);
label++;
}
}
}
}
menuTemplate = localTemplate;
}
if(menuTemplate)
{
if(menu = CreateMenusA(menuTemplate,NULL))
{
if(!LayoutMenus(menu,handle->VisualInfo,
GTMN_NewLookMenus, TRUE,
handle->AmigaGlyph ? GTMN_AmigaKey : TAG_IGNORE,handle->AmigaGlyph,
handle->CheckGlyph ? GTMN_Checkmark : TAG_IGNORE,handle->CheckGlyph,
TAG_DONE))
{
FreeMenus(menu);
menu = NULL;
}
}
}
LTP_Free(handle,localTemplate,allocSize);
}
}
return(menu);
}